package com.hucsmn.landlord;

/**
 * 扑克牌。
 */
public class Poker implements Comparable<Poker> {
    private final Rank rank;
    private final Color color;

    Poker(Rank rank, Color color) {
        if (rank.hasFourColors() ^ color.isFourColor()) {
            throw new IllegalArgumentException();
        }
        this.rank = rank;
        this.color = color;
    }

    @Override
    public int compareTo(Poker o) {
        int rankCmp;
        return (rankCmp = rank.compareTo(o.rank)) != 0 ?
                rankCmp : color.compareTo(o.color);
    }

    @Override
    public String toString() {
        return rank.toString() + color.toString();
    }

    /**
     * 扑克牌大小。
     */
    public enum Rank {
        THREE("3"),
        FOUR("4"),
        FIVE("5"),
        SIX("6"),
        SEVEN("7"),
        EIGHT("8"),
        NINE("9"),
        TEN("10"),
        JACK("J"),
        QUEEN("Q"),
        KING("K"),
        ACE("A"),
        TWO("2"),
        BLACK_JOKER("小王"),
        RED_JOKER("大王");

        // 扑克牌大小的显示格式。
        private final String display;

        Rank(String display) {
            this.display = display;
        }

        /**
         * 检测扑克牌大小是否有四种花色。
         *
         * @return 有四种花色返回真，否则返回假。
         */
        public boolean hasFourColors() {
            return this.ordinal() < BLACK_JOKER.ordinal();
        }

        @Override
        public String toString() {
            return display;
        }
    }

    /**
     * 扑克牌花色。
     */
    public enum Color {
        NONE(""),
        SPADE("♠"),
        HEART("♥"),
        DIAMOND("♦"),
        CLUB("♣");

        // 四种花色。
        private static final Color[] colors = {SPADE, HEART, DIAMOND, CLUB};

        // 花色的显示格式。
        private final String display;

        Color(String display) {
            this.display = display;
        }

        /**
         * 列举四种花色。
         *
         * @return 四种花色列表。
         */
        public static Color[] colors() {
            return colors;
        }

        /**
         * 检测扑克牌花色是否为四种花色的一种。
         *
         * @return 是四种花色的一种返回真，否则返回假。
         */
        public boolean isFourColor() {
            return this.ordinal() > NONE.ordinal();
        }

        @Override
        public String toString() {
            return display;
        }
    }
}
